//
//  ProtocolController.swift
//  HHSwift
//
//  Created by 华宏 on 2019/5/8.
//  Copyright © 2019年 huahong. All rights reserved.
//

import UIKit

protocol SuperProtocol {
    // 对于属性，不能有初始值
    // 统一使用var关键字
    var name : String{get set}
    // 如果protocol有init，则在class中必须注明required
    // 如果是final class, init可以没有required, 因为也不会再被继承了
    init(name: String)

    // 对于方法，不能有实现,不能有默认参数（默认参数就是一种实现）
    // 可以使用mutating关键字，强调这个方法应该修改其内容
    mutating func changeName(newName:String)
    
     func isPrizable() -> Bool
}

// 协议的继承
protocol SubProtocol:SuperProtocol {
    var flySpeed : Double{get}
    var flyHeight : Double{get set}
}

// 扩展一个协议的时候，可以拥有实现！
extension SuperProtocol where Self:CustomStringConvertible{
    mutating func changeName(newName:String){
        self.name = newName
    }
    
    var description: String{
        return "description"
    }
    
    func isPrizable() -> Bool{
        return true
    }
}



//optional protocol
@objc protocol optionalProtocol {
    
    @objc optional func optionalProtocolFunc()
}

// 协议的实现，实现协议规定的所有属性和方法即可
// 如果一个类有继承的类，则父类必须放在前面
struct Dog:SuperProtocol,CustomStringConvertible {
   
    var name: String
    
//    //协议的扩展和这里都实现了该方法，会走这里，否则走扩展里的实现
//    mutating func changeName(newName: String) {
//        name = newName + newName
//    }
}



//        func award(one: CustomStringConvertible & Pet){
func award<T:CustomStringConvertible & SuperProtocol>(one: T){
    //one 遵循两个协议，并且该方法为true
    if one.isPrizable(){
        print("Congratulation! You won a prize!")
    }
    else{
        print("You can not have the prize!")
    }
}

class ProtocolController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.title = "协议"
        
        var dog = Dog(name: "旺财")
        dog.changeName(newName: "啸天")
        print("name:\(dog.name)")
        
        award(one: dog)

    }
    

    

}
